#pragma once

class ICharacter;


class IState
{
public:
	virtual void Enter(ICharacter* owner)=0;
	virtual void Execute(ICharacter* owner)=0;
	virtual void Exit(ICharacter* owner)=0;
};

class CNullState: public IState
{
public:
	virtual void Enter(ICharacter* owner){};
	virtual void Execute(ICharacter* owner){};
	virtual void Exit(ICharacter* owner){};

	static CNullState* GetInstance();
};


//class CFindTargetState: public IState
//{
//public:
//	virtual void Enter(ICharacter* owner);
//	virtual void Execute(ICharacter* owner);
//	virtual void Exit(ICharacter* owner){};
//
//	static CFindTargetState* GetInstance();
//};

class CStandState: public IState
{
public:
	virtual void Enter(ICharacter* owner);
	virtual void Execute(ICharacter* owner);
	virtual void Exit(ICharacter* owner){};

	static CStandState* GetInstance();

	static void FindTarget(ICharacter* owner);
};

class CMoveToDestState : public IState
{
public:
	virtual void Enter(ICharacter* owner);
	virtual void Execute(ICharacter* owner);
	virtual void Exit(ICharacter* owner){};

	static CMoveToDestState* GetInstance();

};

class CTraceTargetState : public IState
{
public:
	virtual void Enter(ICharacter* owner);
	virtual void Execute(ICharacter* owner);
	virtual void Exit(ICharacter* owner){};

	static CTraceTargetState* GetInstance();

};

class CAttackState: public IState
{
public:
	virtual void Enter(ICharacter* owner);
	virtual void Execute(ICharacter* owner);
	virtual void Exit(ICharacter* owner);

	static CAttackState* GetInstance();
};